package com.cyy.queue;

import com.cyy.heap.BinaryHeap;
import com.cyy.heap.Heap;

import java.util.Comparator;

/**
 * 优先级队列
 * 优先级队列则是按照优先级高低进行出队，比如将优先级高的元素作为队头优先出队
 * 底层可以通过二叉堆进行操作，将较大的先出  即堆顶元素先出
 * @author 会玩的洋洋
 * @since 2022-03-01
 * @param <E>
 */
public class PriorityQueue<E> {
    private Heap<E> heap;

    public PriorityQueue() {
        this(null);
    }

    public PriorityQueue(Comparator<E> comparator) {
        this.heap = new BinaryHeap<E>(comparator);
    }

    /**
     * 队列元素的数量
     * @return int
     */
    int size() {
        return heap.size();
    }

    /**
     * 判断队列是否为空
     * @return boolean
     */
    boolean isEmpty() {
        return heap.isEmpty();
    }

    /**
     * 入队
     * @param element 入队元素
     */
    void enQueue(E element) {
        heap.add(element);
    }

    /**
     * 出队
     * @return E
     */
    E deQueue() {
        return heap.remove();
    }

    /**
     * 获取队列头元素
     * @return E
     */
    E front() {
        return heap.get();
    }

    /**
     * 清空队列中的元素
     */
    void clear() {
        heap.clear();
    }
}
